use std::fs::File;
use std::{fs, io};
use std::io::{BufReader};
use std::path::{Path, PathBuf};
// 这里注意需要导入 Write, 不然 writeln! 宏用不了, 会报错.
use std::io::{BufRead, Write};
use regex::Regex;


pub(crate) fn trim_leading_spaces_from_file(path: &PathBuf) -> io::Result<()> {
    // let path = Path::new(filename);
    println!("...");
    let file = File::open(path)?;
    let reader = BufReader::new(file);

    let mut output = Vec::new();

    // 正则表达式匹配模式:
    // 1. 匹配 "数字.标题" 或 "数字.数字标题" 或 "数字.数字.数字标题"
    let re = Regex::new(r"(\d+(\.\d+)+)(\.)?([^\s\d])").unwrap();

    for line in reader.lines() {
        // 去除前面多余空格
        let mut line = line?.trim_start().to_string();

        // 如果行包含特定关键词，跳过处理
        if line.contains("中高级专业") || line.contains("黄富财老师") {
            continue;
        }
        if line.contains("黄") && line.contains("富") && line.contains("财") {
            continue;
        }
        // 替换中文全角括号为英文半角括号
        line = line.replace("（", "(").replace("）", ")");

        line = re.replace_all(&line, |caps: &regex::Captures| {
            if let Some(dot_match) = caps.get(3) {
                // 如果匹配到 ".", 在 "." 后加空格
                format!("{}{} {}", &caps[1], dot_match.as_str(), &caps[4])
            } else {
                // 如果没有 ".", 在数字后加空格
                format!("{} {}", &caps[1], &caps[4])
            }
        }).to_string();
        output.push(line);
    }

    // 写回文件
    let mut file = File::create(path)?;
    for line in output {
        writeln!(file, "{line}")?;
    }
    println!("...");
    Ok(())
}

pub fn scan_directory(dir: &Path) -> Vec<PathBuf> {
    let mut result = Vec::new();

    if dir.is_dir() {
        for entry in fs::read_dir(dir).expect("读取目录失败!") {
            let entry = entry.expect("读取条目失败");
            let path = entry.path();
            // 获取文件名（OsString）
            let file_name = entry.file_name();
            // 过滤隐藏文件
            if !file_name.to_string_lossy().starts_with('.') {
                if let Some(extension) = path.extension() {
                    if extension == "txt" || extension == "md" {
                        result.push(path);
                    }
                }
            }
        }
    }
    result
}